/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package daos;

import entidades.Quarto;
import java.io.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import negocio.NegocioDAO;
import negocio.NegocioException;
import seguranca.Interfaces.IQuarto;

/**
 *
 * @author renan
 */
public class QuartoDAO extends NegocioDAO implements IQuarto {
    private File arquivo;
    private Quarto quarto;
    private final String RELATIVO = "C:\\Users\\renan\\Documents\\NetBeansProjects\\Emirates\\web\\foto\\";

    public QuartoDAO() {
        quarto = new Quarto();
    }

    public void inserir() throws NegocioException, FileNotFoundException, IOException {
        validar();
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        setFoto();
        persistencia.persist(quarto);
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public void alterar() throws NegocioException, FileNotFoundException, IOException {
        validar();
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        persistencia.merge(quarto);
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public void deletar() throws NegocioException {
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        File f = new File(RELATIVO+quarto.getFoto());
        f.delete();
        persistencia.remove(persistencia.find(Quarto.class, quarto.getId()));
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public List<Quarto> pesquisar(String situacao) throws NegocioException {
        List<Quarto> colecao = null;
        EntityManager em = getEntityManager();
        Query quartos = em.createQuery("SELECT q FROM Quarto q WHERE q.situacao = :situacao");
        Query todos = em.createQuery("SELECT q FROM Quarto q");
        if (situacao == null) {
            colecao = todos.getResultList();
        } else {
            quartos.setParameter("situacao", situacao);
            colecao = quartos.getResultList();
        }
        return colecao;
    }

    public List<Quarto> pesquisarSemProxy(String situacao) throws NegocioException {
        List<Quarto> colecao = null;
        EntityManager em = getEntityManager();
        Query quartos = em.createQuery("SELECT q FROM Quarto q WHERE q.situacao = :situacao");
        Query todos = em.createQuery("SELECT q FROM Quarto q");
        if (situacao == null) {
            colecao = todos.getResultList();
        } else {
            quartos.setParameter("situacao", situacao);
            colecao = quartos.getResultList();
        }
        return colecao;
    }

    private void setFoto() throws FileNotFoundException, IOException,NegocioException {
        List<Quarto> lista = pesquisar(null);
        int n = lista.size();
        String id = "";
        if(n==0){
            id = "1";
        }else{
            id = String.valueOf(Integer.parseInt(lista.get(n-1).getId())+1);
        }
        String extensao = id + ".JPEG";
        String caminho = RELATIVO+extensao;
        FileInputStream fileIn = new FileInputStream(arquivo);//file e passado usando JFileChooser
        FileOutputStream saida = new FileOutputStream(caminho);//destino uso padrao
        BufferedInputStream in = new BufferedInputStream(fileIn);
        BufferedOutputStream out = new BufferedOutputStream(saida);

        byte[] buffer = new byte[4096];
        int len = 0;

        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }

        quarto.setFoto(extensao);
    }

    public void validar() throws NegocioException {
        erros.limpar();
        

        if (estaVazio(quarto.getValorDiaria())) {
            erros.campoObrigatorio("valor da diárioa");
        }

        if (estaVazio(quarto.getnCamas())) {
            erros.campoObrigatorio("Nº camas");
        }

        

        if (erros.existe()) {
            throw new NegocioException(erros);
        }
    }

    public void limpar() {
        quarto.setFoto(null);
        quarto.setId("");
        
        quarto.setValorDiaria("");
        quarto.setnCamas("");
        
    }

    public Quarto getQuarto() {
        return quarto;
    }

    public void setQuarto(Quarto quarto) {
        this.quarto = quarto;
    }

    public File getArquivo() {
        return arquivo;
    }

    public void setArquivo(File arquivo) {
        this.arquivo = arquivo;
    }


}
